package Interfaz;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import Logica.*;
import Logica.Robot;

import javax.swing.*;


@SuppressWarnings("serial")
public class GUIBoard extends JPanel { 
	
	protected static final int INTERVALO_WHILE = 50; 
	protected String hacia;
	protected GUIDisparo dis;

	protected GUIRobot rob;
	protected Robot r;
	protected final int OFFSET = 0;
	protected final int SPACE = 40;
	protected final int SPACEY = 40;
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIArenas = new ArrayList();
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIAsfaltos = new ArrayList();
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIConcretos = new ArrayList();
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIFuegos = new ArrayList();
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIAguas = new ArrayList();
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected ArrayList<GUIPintada> GUIArenasPintadas = new ArrayList();
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected ArrayList<GUIDestructible> GUIDestructibles = new ArrayList();
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected ArrayList<GUIColeccionable> GUIColeccionables = new ArrayList();
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected ArrayList<GUIPremio> GUIPremios = new ArrayList();
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected ArrayList<GUIDisparo> GUIDisparos = new ArrayList();
	
	private MyDispatcher oyenteTeclado;
	
	@SuppressWarnings("rawtypes")
	protected ArrayList GUIIniFin = new ArrayList();
	protected int finX, finY;
	protected Mapa map;
	protected Juego j;
	protected int w = 0;
	protected int h = 0;
	protected File fi= new File("mapa.txt");
	protected ReadFile rf=new ReadFile();
	protected String level = rf.leer("mapa.txt");
	
	protected MainWindow mw;


	/**
	 * crea el espacio donde se ejeutara el juego 
	 * @param ju juego que contendra el guiboard
	 * @param tipo string que informa con que robot se jugara esta partida
	 * @param mainw ventana donde se ejecuta el juego
	 */

	public GUIBoard(Juego ju, String tipo, MainWindow mainw) {
		mw=mainw;
		j = ju;
		map=j.getMapa();
		KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		oyenteTeclado=new MyDispatcher();
		manager.addKeyEventDispatcher(oyenteTeclado);
		setFocusable(true);
		initWorld();
		rob = new GUIRobot((map.getInicio()[0]*40),(map.getInicio()[1]*40));
		if (tipo=="civil"){
			r= new Civil(map.getInicio()[0],map.getInicio()[1],map);
		}
		else {
			r= new Militar(map.getInicio()[0],map.getInicio()[1],map);
			
		}
		j.setRobot(r);
		
		
		mw.misiles(r.getMisiles());
		mw.combustible(r.getCombustible());
		
		
	}

	/**
	 * retorna el ancho de la pantalla del guiboard
	 * @return entero con el ancho del guiboard
	 */
	public int getBoardWidth() {
		return this.w;
	}
	
	/**
	 * retorna la altura de la pantalla del guiboard
	 * @return entero con la altura del guiboard
	 */
	public int getBoardHeight() {
		return this.h;
	}

	/**
	 * inicializa el mundo con todos sus objetos, los objetos los asigna segun su mapeo a caracter
	 * inicializa de manera RANDOM los premios que estaran dentro de los objetos destructibles (excepto los tanques de nafta)
	 */
	@SuppressWarnings("unchecked")
	public final void initWorld() {

		int x = OFFSET;
		int y = OFFSET;
		int i=0;
		int j=0;
		GUIArena s;
		GUIAsfalto b;
		GUIConcreto a;
		GUIFuego f;
		GUIAgua w;
		GUICaja c;
		GUIPared p;
		GUINafta naf;
		GUIMoneda tor;
		GUIEstrella bal;
		GUIPlanta pl;
		GUIInicio ini;
		GUILlegada fin;
		for (int n = 0; n < level.length(); n++) {

			char item = level.charAt(n);
			if (item == '\n') {
				y += SPACEY;
				i=0;
				if (this.w < x) {
					this.w = x;
				}
				j++;
				x = OFFSET;
			} 
			else if (item == '&') {
				f = new GUIFuego(x, y);
				GUIFuegos.add(f);
				map.cambiarTerreno(i, j, '&');
				x += SPACE;
				i++;
			} else if (item == '@') {
				w = new GUIAgua(x, y);
				GUIAguas.add(w);
				map.cambiarTerreno(i, j, '@');
				x += SPACE;
				i++;
			} else if (item == 'S') {
				s = new GUIArena(x, y);
				GUIArenas.add(s);
				map.cambiarTerreno(i, j, '#');
				map.setInicio(i, j);
				ini=new GUIInicio(x,y);
				GUIIniFin.add(ini);
				x += SPACE;
				i++;
			} else if (item == 'N') {
				naf = new GUINafta(x+10, y+10);
				GUIPremios.add(naf);
				Nafta nafta=new Nafta(i, j, map);
				map.agregarPremio(i, j, nafta);
				x += SPACE;
				i++;
			} 
			else if (item == 'T') {
				tor = new GUIMoneda(x+10, y+10);
				GUIColeccionables.add(tor);
				Moneda tornillo=new Moneda(i, j, map);
				map.agregarObjetoColeccionable(i, j, tornillo);
				x += SPACE;
				i++;
			} 
			else if (item == 'B') {
				bal = new GUIEstrella(x+10, y+10);
				GUIColeccionables.add(bal);
				Estrella baliza=new Estrella(i, j, map);
				map.agregarObjetoColeccionable(i, j, baliza);
				x += SPACE;
				i++;
			}else if (item == 'F') {
				s = new GUIArena(x, y);
				finX=x;
				finY=y;
				GUIArenas.add(s);
				map.cambiarTerreno(i, j, '#');
				map.setFin(i, j);
				fin=new GUILlegada(x,y);
				GUIIniFin.add(fin);
				x += SPACE;
				i++;
			} else if (item == '#') {
				s = new GUIArena(x, y);
				GUIArenas.add(s);
				map.cambiarTerreno(i, j, '#');
				x += SPACE;
				i++;
			} else if (item == '_') {
				b = new GUIAsfalto(x, y);
				GUIAsfaltos.add(b);
				map.cambiarTerreno(i, j, '_');
				x += SPACE;
				i++;
			} else if (item == 'X') {
				a = new GUIConcreto(x,y);
				GUIConcretos.add(a);
				Concreto caj = new Concreto (i,j,map);
				map.agregarObjetoNoDestructible(i, j, caj);
				x += SPACE;
				i++;

			} else if (item == ' ') {
				x += SPACE;
				i++;
			}else if (item == '['){
				c = new GUICaja(x,y);
				GUIDestructibles.add(c);
				Caja caj = new Caja (i,j,map);
				map.agregarObjetoDestructible(i, j, caj);
				x += SPACE;
				i++;
			}else if (item == '{'){
				pl = new GUIPlanta(x,y);
				GUIDestructibles.add(pl);
				Planta caj = new Planta (i,j,map);
				map.agregarObjetoDestructible(i, j, caj);
				x += SPACE;
				i++;
			}else if (item == '|'){
				p = new GUIPared(x,y);
				GUIDestructibles.add(p);
				Pared par = new Pared (i,j,map);
				map.agregarObjetoDestructible(i, j, par);
				x += SPACE;
				i++;
			}
			h = y;
		}
		Random rand=new Random();
		int poner= rand.nextInt(4);
		int tipoPremio=rand.nextInt(13);
		for (int fil=0; fil<map.getDimensiones()[0]; fil++){
			for (int col=0; col<map.getDimensiones()[1]; col++){
				if (map.getObjetoDestructible(fil, col)!=null){
					poner=rand.nextInt(4);
					if (poner>0){
					
						tipoPremio=rand.nextInt(13);
						if (tipoPremio==0){
							Premio nuevoP=new Puntos(fil, col, 10, map);
							map.agregarPremio(fil, col, nuevoP);
							
						}
						else
							if (tipoPremio==1){
								Premio nuevoP=new Puntos(fil, col, 25, map);
								map.agregarPremio(fil, col, nuevoP);
								

							}
							else
								if (tipoPremio==2){
									Premio nuevoP=new Puntos(fil, col, 50, map);
									map.agregarPremio(fil, col, nuevoP);
									
								}
								else
									if (tipoPremio==3){
										Premio nuevoP=new Puntos(fil, col, 100, map);
										map.agregarPremio(fil, col, nuevoP);
										

									}
									else
										if ((tipoPremio>=4)&&(tipoPremio<10)){
											Premio nuevoP=new Balas(fil, col, map);
											map.agregarPremio(fil, col, nuevoP);
											

										}
										else
											if ((tipoPremio>=10)&&(tipoPremio<13)){
												Premio nuevoP=new Nafta(fil, col, map);
												map.agregarPremio(fil, col, nuevoP);
												

											}
					
					}
					
				}
				}
		}
			
					
					
		
		
	}
	
	/**
	 * contruye el mundo apartir de los distintos arreglos con los objetos, y los cambios que van apareciendo durante la
	 * ejecucion del programa
	 * le asigna una imagen de background al mapa, y sobre este son actualizados las demas componentes del juego
	 * @param g
	 */

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void buildWorld(Graphics g) {

		Image img= (new ImageIcon(getClass().getClassLoader().getResource("Imagenes/background.jpg")).getImage());
		g.drawImage(img, 0, 0, this);

		ArrayList world = new ArrayList();
		world.addAll(GUIAguas);
		world.addAll(GUIFuegos);
		world.addAll(GUIArenas);
		world.addAll(GUIConcretos);
		world.addAll(GUIAsfaltos);
		world.addAll(GUIDestructibles);
		world.addAll(GUIIniFin);
		world.addAll(GUIPremios);
		world.addAll(GUIColeccionables);
		world.addAll(GUIArenasPintadas);
		world.addAll(GUIDisparos); 
		for (int i = 0; i < world.size(); i++) {

			Actor item = (Actor) world.get(i);
			g.drawImage(item.getImage(), item.x(), item.y(), this);

		}
		g.drawImage(rob.getImage(),rob.x(), rob.y(), this);
	}


	/**
	 * actualiza la ejecucion del programa
	 */
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		buildWorld(g);
	}

	private int moverAux(String h){
		return j.moverRobot(h, this);
		
	}
	
	/**
	 * elimina un objeto coleccionable del mapa en la posicion i,j
	 * hay que hacer la conversion de pixeles a su respectiva posicion en la matriz del juego
	 * @param i, j: posicion del objeto coleccionable a eliminar
	 */
	public void borrarOC(int i, int j){
		for(int k=0; k<GUIColeccionables.size();k++){
			GUIColeccionable c = GUIColeccionables.get(k);
			int ocI = (int) ((c.x())/40);
			int ocJ = (int)((c.y())/40);
			if ((ocJ==j)&&(ocI==i))
				GUIColeccionables.remove(k);		
		}
		
		repaint();
	}
	
	/**
	 * agrega un objeto coleccionable al mapa en la posicion i,j.
	 * @param i j: posicion del objeto coleccionable a agregar
	 */
	
	public void agregarOC(int i, int j){
		GUIColeccionable c=map.getObjetoColeccionable(i, j).obtenerGUI(i,j);
		GUIColeccionables.add(c);
		repaint();
	}

	/**
	 * elimina un premio del mapa en la posicion i,j
	 * hay que hacer la conversion de pixeles a su respectiva posicion en la matriz del juego
	 * @param i, j: posicion del premio a eliminar
	 */
	
	public void borrarPremio (int a, int b, String s){
		for (int i=0; i<GUIPremios.size() ; i++){
			int premioI=0;
			int premioJ=0;
			
			GUIPremio n= GUIPremios.get(i);
				if (s=="arriba"){
					 premioI=((n.x())/40);
					 premioJ=((n.y())/40);
					 }
				else if (s=="izquierda"){
					 premioI=((n.x())/40)+1;
					 premioJ=((n.y())/40);
					 }
				else if (s=="derecha"){
					 premioI=((n.x())/40)-1;
					 premioJ=((n.y())/40);
					 }
				else if (s=="abajo"){
					premioI=((n.x())/40);
					 premioJ=((n.y())/40)-1;
					 }
			
			 
			  int robotI=j.getRobot().getPosicionActual()[0];
			  int robotJ=j.getRobot().getPosicionActual()[1];
			  
			if ((premioI==robotI)&&(premioJ==robotJ)){
				GUIPremios.remove(i);
	
			}
		}
		mw.puntos(r.getPuntos());
		repaint();
	}
	

	public void disparar (final int[] a){
		dis=new GUIDisparo(rob.x(), rob.y());
		hacia="";
		if ((j.getRobot().getPosicionActual()[0]==j.getRobot().getPosicionSiguiente()[0])&&(j.getRobot().getPosicionActual()[1]==j.getRobot().getPosicionSiguiente()[1]-1)){
			
            hacia="abajo";
		}
		
		else
			if ((j.getRobot().getPosicionActual()[0]==j.getRobot().getPosicionSiguiente()[0])&&(j.getRobot().getPosicionActual()[1]==j.getRobot().getPosicionSiguiente()[1]+1)){
				
	            hacia="arriba";
			}
			
			else
				if ((j.getRobot().getPosicionActual()[0]==j.getRobot().getPosicionSiguiente()[0]-1)&&(j.getRobot().getPosicionActual()[1]==j.getRobot().getPosicionSiguiente()[1])){
					
		            hacia="derecha";
				}
				
				else
					if ((j.getRobot().getPosicionActual()[0]==j.getRobot().getPosicionSiguiente()[0]+1)&&(j.getRobot().getPosicionActual()[1]==j.getRobot().getPosicionSiguiente()[1])){
						
			            hacia="izquierda";
					}
		dis.cargarImagen(hacia);
		GUIDisparos.add(dis);
		
		if (a[0]!=5){
			mw.misiles(r.getMisiles());
			Runnable runnable = new Runnable(){ 
				public void run(){ 
					
					GUIDisparo dis_aux=dis;
					String hacia_aux=hacia;
					int[] a_aux=a;
					
					int spaI=0;
					int spaJ=0;
						
					
					if (a_aux[0]==0){
						while ((((dis_aux.x()/40)+1<map.getDimensiones()[0])&&((dis_aux.y()/40)+1<map.getDimensiones()[1])&&((dis_aux.y()/40)>0)&&((dis_aux.x()/40)>0))){
					     	
								if(hacia_aux=="arriba"){
									spaI=0;
									spaJ=-40;
								}
								else
									if(hacia_aux=="abajo"){
										spaI=0;
										spaJ=40;
									}
									else
										 if(hacia_aux=="derecha"){
												spaI=40;
												spaJ=0;
											}
										 else 
											 if (hacia_aux=="izquierda"){
													spaI=-40;
													spaJ=0;
												}
								dis_aux.move(spaI, spaJ);
								GUIDisparos.remove(0);
								GUIDisparos.add(dis_aux);
								repaint();  
								
								try {
									Thread.sleep(INTERVALO_WHILE); 
								} catch (InterruptedException e) {
									e.printStackTrace();
								}
								
							}
						
						dis.cargarBoom();
						repaint();
						try {
							Thread.sleep(200);
						} catch (InterruptedException e) {}
						GUIDisparos.remove(0);
						repaint();
						
						
					}
					else
						if(a_aux[0]==1||a_aux[0]==2){
							
							if(hacia_aux=="arriba"){
								while ((dis_aux.y()/40)+1>a_aux[2]+2){
							     	spaI=0;
									spaJ=-40;
									dis_aux.move(spaI, spaJ);
									GUIDisparos.remove(0);
									GUIDisparos.add(dis_aux);
									repaint();  
									
									try {
										Thread.sleep(INTERVALO_WHILE); 
									} catch (InterruptedException e) {
										e.printStackTrace();
									}
									
								}
								dis.cargarBoom();
								repaint();
								try {
									Thread.sleep(200);
								} catch (InterruptedException e) {}
								GUIDisparos.remove(0);
								repaint();
							}
							else
								if(hacia_aux=="abajo"){
									while ((dis_aux.y()/40)+1<a_aux[2]){
								     	spaI=0;
										spaJ=40;
										dis_aux.move(spaI, spaJ);
											GUIDisparos.remove(0);
											GUIDisparos.add(dis_aux);
											repaint();  
											
											try {
												Thread.sleep(INTERVALO_WHILE); 
											} catch (InterruptedException e) {
												e.printStackTrace();
											}
											
										}
									dis.cargarBoom();
									repaint();
									try {
										Thread.sleep(200);
									} catch (InterruptedException e) {}
									GUIDisparos.remove(0);
									repaint();
									
								}
								else
									 if(hacia_aux=="derecha"){
										  while ((dis_aux.x()/40)+1<a_aux[1]){
										     	spaI=40;
												spaJ=0;
													dis_aux.move(spaI, spaJ);
													GUIDisparos.remove(0);
													GUIDisparos.add(dis_aux);
													repaint();  
													
													try {
														Thread.sleep(INTERVALO_WHILE);
													} catch (InterruptedException e) {
														e.printStackTrace();
													}
													
												}
										  	dis.cargarBoom();
											repaint();
											try {
												Thread.sleep(200);
											} catch (InterruptedException e) {}
											GUIDisparos.remove(0);
											repaint();
										}
									 else 
										 if (hacia_aux=="izquierda"){
											 while ((dis_aux.x()/40)+1>a_aux[1]+2){
											     	spaI=-40;
													spaJ=0;
													dis_aux.move(spaI, spaJ);
														GUIDisparos.remove(0);
														GUIDisparos.add(dis_aux);
														repaint();  
														
														try {
															Thread.sleep(INTERVALO_WHILE); 
														} catch (InterruptedException e) {
															e.printStackTrace();
														}
														
													}
											 	dis.cargarBoom();
												repaint();
												try {
													Thread.sleep(200);
												} catch (InterruptedException e) {}
												GUIDisparos.remove(0);
												repaint();
											}
						}
					if (a_aux[0]==2)
						if(map.getObjetoDestructible(a_aux[1], a_aux[2])==null){
							boolean borre=false;
							GUIDestructible g=null;
							int i=0;
							
							while ((!borre)&&(i<GUIDestructibles.size())){
								int destI=0;
								int destJ=0;
								g= GUIDestructibles.get(i);
								destI=((g.x())/40);
								destJ=((g.y())/40);
								if ((destI==a_aux[1])&&(destJ==a_aux[2])){
									GUIDestructibles.remove(i);
									if(map.getPremio(a_aux[1], a_aux[2])!=null){
										GUIPremio p=map.getPremio(a_aux[1], a_aux[2]).obtenerGUI();
										p.setX(g.x());
										p.setY(g.y());
										GUIPremios.add(p);
										}
									
										
										
									repaint();
								}
								i++;
							
								
							}
						}

					
					
				} // end - run
			}; // end - new Runnable
			Thread thread_while = new Thread(runnable);
			thread_while.start(); 
			
			} 
		
		
		
			
	}
	
	
	
	private class MyDispatcher implements KeyEventDispatcher {
		@SuppressWarnings("static-access")
		public boolean dispatchKeyEvent(KeyEvent e) {

			int mov;
			int key = e.getKeyCode();
			key = e.getKeyCode(); 

			if(e.getID() == e.KEY_PRESSED){

				if (key == KeyEvent.VK_LEFT) {
					mov=moverAux("izquierda");
					if(mov==1){
						rob.move(-SPACE,0);					
					}else
						if (mov==2){
							rob.move(-SPACE,0);
							KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(oyenteTeclado);
							JOptionPane.showMessageDialog(getParent(), "Ganaste!");
							mw.reiniciar();
		
						}
					if(!r.getEstadoPincel()){
						int color = r.getColorPincel();
						int posActI=r.getPosicionActual()[0];
						int posActJ=r.getPosicionActual()[1];
						if (color == 0){
							GUINegroH ANH = new GUINegroH(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ANH);
							map.cambiarTerreno(posActI,posActJ , '0');
						}else{
							GUIBlancoH ABH = new GUIBlancoH(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ABH);
							map.cambiarTerreno(posActI,posActJ ,'1');								
						}
					}
					rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotIzquierda.png")).getImage());
					mw.misiles(r.getMisiles());
					mw.combustible(r.getCombustible());
				}else if (key == KeyEvent.VK_RIGHT) { 
					mov=moverAux("derecha");
					if(mov==1){
						rob.move(SPACE,0);
					}else
						if (mov==2){
							rob.move(SPACE,0);
							KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(oyenteTeclado);
							JOptionPane.showMessageDialog(getParent(), "Ganaste!");
							mw.reiniciar();
						}
					if(!r.getEstadoPincel()){
						int color = r.getColorPincel();
						int posActI=r.getPosicionActual()[0];
						int posActJ=r.getPosicionActual()[1];
						if (color == 0){
							GUINegroH ANH = new GUINegroH(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ANH);
							map.cambiarTerreno(posActI,posActJ , '0');
						}else{
							GUIBlancoH ABH = new GUIBlancoH(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ABH);
							map.cambiarTerreno(posActI,posActJ ,'1');								
						}
					}
					rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotDerecha.png")).getImage());
					mw.misiles(r.getMisiles());
					mw.combustible(r.getCombustible());
				}else if (key == KeyEvent.VK_UP) {
					mov=moverAux("arriba");
					if(mov==1){
						rob.move(0,-SPACE); 
					}else
						if (mov==2){
							rob.move(0,-SPACE); 
							KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(oyenteTeclado);
							JOptionPane.showMessageDialog(getParent(), "Ganaste!");
							mw.reiniciar();
						}
					if(!r.getEstadoPincel()){
						int color = r.getColorPincel();
						int posActI=r.getPosicionActual()[0];
						int posActJ=r.getPosicionActual()[1];
						if (color == 0){
							GUINegroV ANV = new GUINegroV(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ANV);
							map.cambiarTerreno(posActI,posActJ , '0');
						}else{
							GUIBlancoV ABV = new GUIBlancoV(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ABV);
							map.cambiarTerreno(posActI,posActJ ,'1');								
						}
					}
					rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotArriba.png")).getImage());
					mw.misiles(r.getMisiles());
					mw.combustible(r.getCombustible());
				}else if (key == KeyEvent.VK_DOWN){ 
					mov=moverAux("abajo");
					if(mov==1){
						rob.move(0,SPACE);
					}else
						if (mov==2){
							rob.move(0,SPACE);
							KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(oyenteTeclado);
							JOptionPane.showMessageDialog(getParent(), "Ganaste!");
							mw.reiniciar();
						}
					if(!r.getEstadoPincel()){
						int color = r.getColorPincel();
						int posActI=r.getPosicionActual()[0];
						int posActJ=r.getPosicionActual()[1];
						if (color == 0){
							GUINegroV ANV = new GUINegroV(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ANV);
							map.cambiarTerreno(posActI,posActJ , '0');
						}else{
							GUIBlancoV ABV = new GUIBlancoV(posActI*40,posActJ*40);
							GUIArenasPintadas.add(ABV);
							map.cambiarTerreno(posActI,posActJ ,'1');								
						}
					}
					rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotAbajo.png")).getImage());
					mw.misiles(r.getMisiles());
					mw.combustible(r.getCombustible());
					
				}
				else
					if(key == KeyEvent.VK_D){
						int a[]=j.getRobot().accion1();
						if(a[0]!=5)
							disparar(a);
					}
					
				if (key ==KeyEvent.VK_A){
					
					int posSI=r.getPosicionSiguiente()[0];
					int posSJ=r.getPosicionSiguiente()[1];
					if (map.hayObjetoColeccionable(posSI,posSJ)){
						map.getObjetoColeccionable(posSI, posSJ).agregar(r);
						r.agregarObjetoColeccionable(map.getObjetoColeccionable(posSI,posSJ));
						map.quitarObjetoColeccionable(posSI, posSJ);
						r.actualizar(mw);
						
						borrarOC(posSI,posSJ);
					}
				}
				if (key== KeyEvent.VK_S){
					int posSI=r.getPosicionSiguiente()[0];
					int posSJ=r.getPosicionSiguiente()[1];
					if ((!map.hayObjetoColeccionable(posSI,posSJ))&&(!map.hayObjetoDestructible(posSI,posSJ))&&(!map.hayObjetoNoDestructible(posSI,posSJ))&&(!map.hayPremio(posSI,posSJ))&&(!r.baulEmpty())){
						r.getBaul()[r.getOcupadosBaul()-1].quitar(r);
						ObjetoColeccionable oc = r.sacarObjetoColeccionable();
						map.agregarObjetoColeccionable(posSI, posSJ, oc);
						r.actualizar(mw);
						agregarOC(posSI,posSJ);
						
					}
				}

			}
			if (r.getCombustible()==0){
				KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(oyenteTeclado);
				JOptionPane.showMessageDialog(getParent(), "Perdiste! :S te quedaste sin combustible!");
				mw.reiniciar();
			}
			repaint(); 
			return false;
		}
	}
	
	/**
	 * devuelve el mapa correspondiente al GUIBoard
	 * @return retorna el mapa del GUIBoard
	 */
	public Mapa getMapa(){
		return map;
	}
	/**
	 * gira el robot de acuerdo al string pasado por parametro
	 * @param h: indica como girara el robot
	 */
	public void girar(String h){
		String quedo=j.girar(h);
		if (quedo=="arriba")
			rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotArriba.png")).getImage());
		else
			if (quedo=="abajo")
				rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotAbajo.png")).getImage());
			else
				if (quedo=="derecha")
					rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotDerecha.png")).getImage());
				else
					if (quedo=="izquierda")
						rob.setImage(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/robotIzquierda.png")).getImage());
	repaint();
	}
	
	/**
	 * devuelve el robot correspondiente al GUIBoard
	 * @return retorna el robot del GUIBoard
	 */
	
	public Robot getRobot(){
		return r;
	
	}



}